package com.wink_172.library.utils

import android.util.Log
import com.tencent.cos.xml.CosXmlService
import com.tencent.cos.xml.CosXmlServiceConfig
import com.tencent.cos.xml.exception.CosXmlClientException
import com.tencent.cos.xml.exception.CosXmlServiceException
import com.tencent.cos.xml.listener.CosXmlResultListener
import com.tencent.cos.xml.model.CosXmlRequest
import com.tencent.cos.xml.model.CosXmlResult
import com.tencent.cos.xml.model.`object`.DeleteMultiObjectRequest
import com.tencent.cos.xml.model.`object`.DeleteMultiObjectResult
import com.tencent.cos.xml.transfer.*
import com.tencent.qcloud.core.auth.QCloudCredentialProvider
import com.tencent.qcloud.core.auth.ShortTimeCredentialProvider
import com.wink_172.library.LibApplication
import com.wink_172.library.callback.ICallback
import com.wink_172.library.model.Constants
import com.wink_172.library.thirdParty.MySessionCredentialProvider
import org.xutils.x

/**
 * 腾讯云管理工具
 * */

object TencentCosUtils {
private const val TAG = "TencentCosUtils"


/**
 * 腾讯云删除文件增加回调
 *    * 请参考短视频精选
 * 因为封装在内部，外部modle无法识别CosXmlService,编译就报错，所以该参数也没有办法从调用者传递过来
 * 外部调用者不会再涉及任何关于腾讯云的东西包括类名方法名   反正调用频率也不高 initTectentCos多次调用就多次调用吧
 *
 *bucket  TENCENT_BUCKET = "fun4demo-1254407438" //存储桶BucketName-APPID
 * objectList  cos实际地址列表
 * */
@JvmStatic
fun deleteBucketFile(objectList: List<String>,bucket:String, callback: ICallback) {
    val cos_xml_srevice =  LibApplication.cosService!!
    val deleteMultiObjectRequest =
        DeleteMultiObjectRequest(bucket, objectList)
// Quiet 模式只返回报错的 Object 信息。否则返回每个 Object 的删除结果。
    // Quiet 模式只返回报错的 Object 信息。否则返回每个 Object 的删除结果。
    deleteMultiObjectRequest.setQuiet(true)
    cos_xml_srevice.deleteMultiObjectAsync(deleteMultiObjectRequest,
        object : CosXmlResultListener {
            override fun onSuccess(cosXmlRequest: CosXmlRequest, result: CosXmlResult) {
                val deleteMultiObjectResult: DeleteMultiObjectResult =
                    result as DeleteMultiObjectResult

                callback.onSendEvent(Constants.EventEnum.网络请求成功.ordinal, "")
                Log.e(TAG, "delete onSuccess: ====>>")
            }

            override fun onFail(
                p0: CosXmlRequest?,
                clientException: CosXmlClientException?,
                serviceException: CosXmlServiceException?
            ) {
                Log.e(TAG, "delete onFail: ====>>")
                callback.onSendEvent(Constants.EventEnum.网络请求错误.ordinal, "")
                if (clientException != null) {
                    clientException.printStackTrace()
                } else {
                    serviceException?.printStackTrace()
                }
            }


        })
}


/**
 * 腾讯云上传文件增加回调
 *    * 请参考短视频精选
 * 因为封装在内部，外部modle无法识别CosXmlService,编译就报错，所以该参数也没有办法从调用者传递过来
 * 外部调用者不会再涉及任何关于腾讯云的东西包括类名方法名   反正调用频率也不高 initTectentCos多次调用就多次调用吧
 * */
@JvmStatic
fun uploadTectentFile(cosPath: String, filePath: String,bucket:String, callback: ICallback) {
    if(LibApplication.cosService==null){
//        腾讯云未初始化
        Log.e(TAG, ": ====腾讯云未初始化" )
        callback.onSendEvent(Constants.EventEnum.上传失败.ordinal, "腾讯云未初始化")
        return
    }

    val cos_xml_srevice =  LibApplication.cosService!!
    // 初始化 TransferConfig，这里使用默认配置，如果需要定制，请参考 SDK 接口文档
    val transferConfig = TransferConfig.Builder().build()
    val transferManager = TransferManager(
        cos_xml_srevice,
        transferConfig
    )


//若存在初始化分块上传的 UploadId，则赋值对应的 uploadId 值用于续传；否则，赋值 null
    val uploadId: String? = null
    val cosxmlUploadTask: COSXMLUploadTask = transferManager.upload(
        bucket, cosPath,
        filePath, uploadId
    )

//设置上传进度回调
    //设置上传进度回调
    cosxmlUploadTask.setCosXmlProgressListener { complete, target ->
        // todo Do something to update progress...
        //target总量
        //complete进度
        callback.onSendEvent(Constants.EventEnum.上传进度.ordinal, target,complete)
    }
//设置返回结果回调
    //设置返回结果回调
    cosxmlUploadTask.setCosXmlResultListener(object : CosXmlResultListener {
        override fun onSuccess(request: CosXmlRequest, result: CosXmlResult) {
            val cOSXMLUploadTaskResult = result as COSXMLUploadTask.COSXMLUploadTaskResult

            //                CommonUtils.showToast("上传成功！！");
//            Log.e(TAG, "onSuccess: ====>>"+   cOSXMLUploadTaskResult.accessUrl)
            callback.onSendEvent(
                Constants.EventEnum.上传成功.ordinal,
                cOSXMLUploadTaskResult.accessUrl
            )

        }

        override fun onFail(
            request: CosXmlRequest,
            clientException: CosXmlClientException?,
            serviceException: CosXmlServiceException?
        ) {
            callback.onSendEvent(Constants.EventEnum.上传失败.ordinal, "")

            if (clientException != null) {
                clientException.printStackTrace()
                Log.e(TAG, "onFail: ====>>"+    clientException.printStackTrace()+clientException.toString())
            }

            if(serviceException!=null){
                serviceException.printStackTrace()
                Log.e(TAG, "onFail: ====>>"+       serviceException.printStackTrace()+serviceException.toString())
            }
        }
    })


//设置任务状态回调, 可以查看任务过程
    cosxmlUploadTask.setTransferStateListener(
        object :
            TransferStateListener{
        override fun onStateChanged(event: TransferState) {//这个callback用的非常巧妙    //这里因为不能传递非Serialiazable,对象 所以需要精简代码
//            Log.e(TAG, "onStateChanged: ====>>"+event )
        }
    })


}


/**
 * 初始化方式1
 * 初始化腾讯cos 并返回CosXmlService
 * 请参考短视频精选
 * 因为封装在内部，外部modle无法识别CosXmlService,编译就报错，所以该参数也没有办法从调用者传递过来
 * 外部调用者不会再涉及任何关于腾讯云的东西包括类名方法名   反正调用频率也不高 initTectentCos多次调用就多次调用吧
 * secretId   AKIDCIH7mIBxAIcDl76k3GS1TkrmVELx2K70
 * secretKey   8JUYP4nPrAIEyVpwrZkkbFj071jGb5Oa
 * region      ap-guangzhou       存储桶所在地域简称，例如广州地区是 ap-guangzhou
 */
@JvmStatic
fun initTectentCos(secretId:String,secretKey:String) {
    val region=  "ap-guangzhou"

    // keyDuration 为请求中的密钥有效期，单位为秒
    val myCredentialProvider: QCloudCredentialProvider =
        ShortTimeCredentialProvider(secretId, secretKey, 300000000)

    // 创建 CosXmlServiceConfig 对象，根据需要修改默认的配置参数
    val serviceConfig = CosXmlServiceConfig.Builder()
        .setRegion(region)
        .isHttps(true) // 使用 HTTPS 请求, 默认为 HTTP 请求
        .builder()

    // 初始化 COS Service，获取实例
    LibApplication.cosService=CosXmlService(
        x.app(),
        serviceConfig, myCredentialProvider
    )


}

/**
 *  * 初始化方式2
 * 初始化腾讯cos 并返回CosXmlService
 * 请参考短视频精选
 * 因为封装在内部，外部modle无法识别CosXmlService,编译就报错，所以该参数也没有办法从调用者传递过来
 * 外部调用者不会再涉及任何关于腾讯云的东西包括类名方法名   反正调用频率也不高 initTectentCos多次调用就多次调用吧
 * secretId   AKIDCIH7mIBxAIcDl76k3GS1TkrmVELx2K70
 * secretKey   8JUYP4nPrAIEyVpwrZkkbFj071jGb5Oa
 * region      ap-guangzhou       存储桶所在地域简称，例如广州地区是 ap-guangzhou
 */
@JvmStatic
fun initTectentCosTempSing(secretId:String,secretKey:String,token:String,startTime:Long,expiredTime:Long) {
    val region=  "ap-guangzhou"
    val myCredentialProvider: MySessionCredentialProvider =
        MySessionCredentialProvider(secretId, secretKey, token,startTime,expiredTime)

    // 创建 CosXmlServiceConfig 对象，根据需要修改默认的配置参数
    val serviceConfig = CosXmlServiceConfig.Builder()
        .setRegion(region)
        .isHttps(true) // 使用 HTTPS 请求, 默认为 HTTP 请求
        .builder()

    // 初始化 COS Service，获取实例
    LibApplication.cosService=CosXmlService(
        x.app(),
        serviceConfig, myCredentialProvider
    )

}


    /**
     * 天天跳舞专属 勿动
     * */
    @JvmStatic
    fun initTiantianTiaowuTencent(){
        val secretId="AKIDmSyJTRbnmeR5winkYpwmV4SjsukOtCJFbWsJ"
        val secretKey="ymitxqX4UlurcBYjjYBhVBi6KPL8mIer"


        initTectentCos(secretId.replace("wink",""), secretKey)
    }
}